using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Expression;
using Didsoft.DataAccess.NHibernate;
using Didsoft.DataAccess.Contracts;
using ICIA.ARojas.AccesoDatos.Entidades;
using ICIA.ARojas.AccesoDatos.Contratos;

namespace ICIA.ARojas.AccesoDatos.Contexto
{
   public class DestinoFisicoAccesoDatos : DataAccessBase<DestinoFisico>, IDestinoFisicoAccesoDatos
   {
     public DestinoFisicoAccesoDatos()
     {
     }
     
     /// <summary>
     /// Devuelve una lista IList<DestinoFisico> con todas las ocurrencias encontradas, en base a filtro.
     /// </summary>
     /// <param name="filtro"></param>
     /// <returns></returns>
     public IList<DestinoFisico> BuscarPorFiltro(string filtro)
     {
             ICriteria criteria = Session.CreateCriteria(typeof(DestinoFisico));
             criteria.Add(Expression.Like("NombrePropiedad", filtro+"%")); 
             return criteria.List<DestinoFisico>();
     }


     public List<DestinoFisico> ObtenerHijosPorPadreId(int destinoPadreId)
     {
         var hql = "From DestinoFisico as df where df.DestinoFisicoPadre.Id = :destinoPadreId";
         var query = Session.CreateQuery(hql);
         query.SetInt32("destinoPadreId", destinoPadreId);
         return query.List<DestinoFisico>().ToList();
     }


     public List<DestinoFisico> ConstruirArbolPorNivel(int nivel)
     {
         var sql = @"with	temp(DestinofisicoId,DestinofisicoPadreId,Codigo,Nombre,Ubicacion,Descripcion,Comandante,ICIA,Auxiliar,nivel) as
                          (select		df.DestinofisicoId,df.DestinofisicoPadreId,df.Codigo,df.Nombre,df.Ubicacion,df.Descripcion,df.Comandante,df.ICIA,df.Auxiliar,0
                          from			DestinoFisico df
                          where			df.DestinoFisicoPadreId is null 
                          union all
                          select		df.DestinofisicoId,df.DestinofisicoPadreId,df.Codigo,df.Nombre,df.Ubicacion,df.Descripcion,df.Comandante,df.ICIA,df.Auxiliar,t.nivel+1
                          from			DestinoFisico df
	                        inner join	temp t on t.DestinofisicoId = df.DestinoFisicoPadreId)

                          select		*
                          from			temp
                          where nivel = :nivel";
         var query = Session.CreateSQLQuery(sql).AddEntity(typeof(DestinoFisico));
         query.SetInt32("nivel", nivel);
         return query.List<DestinoFisico>().ToList();
     }
   }
}

